package FileIO;

import model.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.util.Iterator;
import java.util.List;


public class PersistenciaPersonajes extends Persistible {

    private static PersistenciaPersonajes INSTANCE = null;


    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new PersistenciaPersonajes();
        }
    }

    public static PersistenciaPersonajes getInstance() {
        createInstance();
        return INSTANCE;
    }

    @SuppressWarnings("CloneDoesntCallSuperClone")
    @Override
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

    @Override
    public void persistir(Escenario escenario) {
        Document documentoXML = DocumentoXML.INSTANCE.getDocumentoXML();
        Element nodoJuego = documentoXML.createElement(Constantes.JUEGO);
        Pacman pacman = escenario.getPacMan();
        String finJuego = "" + escenario.checkearFinDeJuego();

        nodoJuego.setAttribute(Constantes.POSICION_PACMAN, getNumberWithCero(pacman.getPosicion().getY()) + getNumberWithCero(pacman.getPosicion().getX()));
        nodoJuego.setAttribute(Constantes.FILA, getNumberWithCero(pacman.getPosicion().getY() - 1));
        nodoJuego.setAttribute(Constantes.COLUMNA, getNumberWithCero(pacman.getPosicion().getX() - 1));
        nodoJuego.setAttribute(Constantes.SENTIDO, Juego.getInstance().getSentidoPacman());
        nodoJuego.setAttribute(Constantes.PUNTAJE,Constantes.PUNTAJE_VAL);
        nodoJuego.setAttribute(Constantes.FIN_JUEGO, finJuego);
        documentoXML.appendChild(nodoJuego);

        List<Fantasma> fantasmas = escenario.getFantasmas();

        int idFantasma = 1;
        for (Iterator<Fantasma> iterator = fantasmas.iterator(); iterator.hasNext(); idFantasma++) {

            Fantasma fantasma = iterator.next();
            ElemEscenario posicion = fantasma.getPosicion();
            Element nodoFantasma = documentoXML.createElement(Constantes.FANTASMA);

            nodoFantasma.setAttribute(Constantes.ID, "" + idFantasma);
            nodoFantasma.setAttribute(Constantes.NODO, getNumberWithCero(posicion.getY()-1) + getNumberWithCero(posicion.getX()-1));
            nodoFantasma.setAttribute(Constantes.FILA, getNumberWithCero(posicion.getY()-1));
            nodoFantasma.setAttribute(Constantes.COLUMNA, getNumberWithCero(posicion.getX()-1));
            nodoFantasma.setAttribute(Constantes.SENTIDO, fantasma.mostrarSentido());
            nodoFantasma.setAttribute(Constantes.PERSONALIDAD, fantasma.mostrarVivacidad());
            nodoFantasma.setAttribute(Constantes.ESTADO, "" + fantasma.mostrarEstado());
            nodoJuego.appendChild(nodoFantasma);
        }

        escribirDocumentoEnArchivo(documentoXML, AppConfig.getInstance().getPathSalida() + Constantes.PREFIJO_PERSONAJES_TICK + turnoArchivo() + Constantes.EXTENSION_XML);
        DocumentoXML.INSTANCE.limpiarDocumento();
    }

    private int turnoArchivo() {
        return Juego.getInstance().getTurno() + 1;
    }
}
